package com.charon.common.util;

import java.io.Serializable;
import java.util.List;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.UnavailableSecurityManagerException;
import org.apache.shiro.session.InvalidSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.util.SerializationUtils;

import com.charon.common.security.cache.RedisCache;
import com.charon.module.sys.dao.UserEntityMapper;
import com.charon.module.sys.entity.UserEntity;

/**
 * @ClassName：UserUtils.java
 * @Description: 账户信息工具类
 * @Author charon [248135724@qq.com]
 * @Date: 2019年1月7日 上午10:14:05
 * @version V1.0
 */
public class UserUtils {

	private static UserEntityMapper uem = SpringContextHolder.getBean(UserEntityMapper.class);
	private static JedisUtils ju = SpringContextHolder.getBean(JedisUtils.class);
	/**
	 * 根据ID获取用户
	 * @param id
	 * @return 取不到返回null
	 */
	public static UserEntity get(Integer id) {
		UserEntity user = uem.selectByPrimaryKey(id);
		if (user == null) {
			return null;
		}
		return user;
	}

	/**
	 * 根据登录名获取用户
	 * @param loginName
	 * @return 取不到返回null
	 */
	public static UserEntity getByLoginName(String loginName){
		UserEntity ue=new UserEntity();
		ue.setAccount(loginName);
		List<UserEntity> list= uem.findList(ue);
		if (list!= null&&list.size()>0) {
			return list.get(0);
		}
		return null;
	}
	
	/**
	 * @Description: 获取当前登录认证对象
	 * @Author charon [248135724@qq.com]
	 * @Date: 2019年1月7日 上午10:57:29 @return：
	 */
	public static String getPrincipal() {
		try {
			Subject subject = SecurityUtils.getSubject();
			String principal = (String) subject.getPrincipal();
			if (principal != null) {
				return principal;
			}
		} catch (UnavailableSecurityManagerException e) {
			e.printStackTrace();
		} catch (InvalidSessionException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @Description: 获取Session对象
	 * @Author charon [248135724@qq.com]
	 * @Date: 2019年1月7日 上午11:30:10 @return：
	 */
	public static Session getSession() {
		try {
			Subject subject = SecurityUtils.getSubject();
			Session session = subject.getSession(false);
			if (session == null) {
				session = subject.getSession();
			}
			if (session != null) {
				return session;
			}
		} catch (InvalidSessionException e) {

		}
		return null;
	}

	/**
	 * @Description: 获取SessionId
	 * @Author charon [248135724@qq.com]
	 * @Date:   2019年1月11日 上午12:12:02 
	 * @return：
	 */
	public static Serializable getSessionId(){
		return getSession().getId();
	}
	
	/**
	 * @Description: 当前用户退出登录
	 * @Author charon [248135724@qq.com]
	 * @Date: 2019年1月7日 上午11:07:37
	 */
	public static void logout() {
		SecurityUtils.getSubject().logout();
	}

	/**
	 * @Description: 从session中移除当前用户信息
	 * @Author charon [248135724@qq.com]
	 * @Date: 2019年1月7日 上午11:48:47
	 */
	public static void removeCache(String key) {
		getSession().removeAttribute(key);
	}

	/**
	 * @Description:获取当前用户信息
	 * @Author charon [248135724@qq.com]
	 * @Date: 2019年1月7日 上午11:51:03
	 * @return：用户信息
	 */
	public static UserEntity getUser() {
		String principal = getPrincipal();
		if (principal != null) {
			return (UserEntity) SerializationUtils.deserialize(ju.getValue(getUserKey(principal)));
		}
		return null;
	}

	/**
	 * @Description: Redis生成获取用户的key
	 * @Author charon [248135724@qq.com]
	 * @Date:   2019年1月7日 下午9:25:08 
	 * @return：
	 */
	private static byte[] getUserKey(String userName){
		return (RedisCache.USER_PREFIX+userName+getSessionId()).getBytes();
	}
}
